
#include <iostream>
#include <stdlib.h> // 为了使用exit函数
using namespace std;

#define MAXSIZE 100    // 最大长度
#define OVERFLOW -2 
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

typedef struct {
    ElemType *elem;    // 指向数据元素的基地址
    int length;        // 线性表的当前长度                                                      
} SqList;
 
// 构造一个空的顺序表L
Status InitList_Sq(SqList &L) {    
    L.elem = new ElemType[MAXSIZE];   // 为顺序表分配空间
    if (!L.elem) exit(OVERFLOW);      // 存储分配失败
    L.length = 0;   // 空表长度为0
    return OK;
}
 
// 获取顺序表中第i个元素的值
Status GetElem(SqList L, int i, ElemType &e) {
    if (i < 1 || i > L.length) return ERROR;   // 判断i值是否合理
    e = L.elem[i - 1];   // 第i-1的单元存储着第i个数据
    return OK;
}

// 在顺序表第i个位置插入元素e
Status ListInsert_Sq(SqList &L, int i, ElemType e) {    
    int j;
    if (i < 1 || i > L.length + 1) return ERROR;    // i值不合法
    if (L.length == MAXSIZE) return ERROR; // 当前存储空间已满
    for (j = L.length - 1; j >= i - 1; j--)
        L.elem[j + 1] = L.elem[j]; // 插入位置及之后的元素后移
    L.elem[i - 1] = e;            // 将新元素e放入第i个位置
    ++L.length;                   // 表长增1
    return OK;
}

// 删除顺序表中第i个元素，并将其值保存到e中
Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
    int j;
    if (i < 1 || i > L.length) return ERROR;  // i值不合法
    e = L.elem[i - 1];                        // 将欲删除的元素保留在e中
    for (j = i; j <= L.length - 1; j++)
        L.elem[j - 1] = L.elem[j];            // 被删除元素之后的元素前移
    --L.length;                               // 表长减1
    return OK;
}

// 清空顺序表（保留表结构，清空元素）
Status ClearList_Sq(SqList &L) {
    L.length = 0;  // 只需将表长设为0即可
    return OK;
}

// 销毁顺序表（释放内存，不再保留表结构）
Status DestroyList_Sq(SqList &L) {
    if (L.elem) {
        delete[] L.elem;  // 释放动态分配的内存
        L.elem = NULL;    // 避免野指针
        L.length = 0;     // 表长设为0
    }
    return OK;
}

// 打印顺序表元素
void PrintList(SqList L) {
    cout << "当前顺序表的元素有：";
    for (int i = 0; i < L.length; i++) {
        cout << L.elem[i] << " ";
    }
    cout << endl;
    cout << "当前顺序表长度为：" << L.length << endl;
}

int main() {
    SqList L;
    int i, j;
    ElemType e;
 
    if (InitList_Sq(L)) {
        cout << "成功初始化顺序表！" << endl;  
    }
    
    // 初始化顺序表，添加10个元素
    L.length = 10;
    for (i = 0; i < L.length; i++) {
        L.elem[i] = i + 1;
    }
    PrintList(L);
    
    // 插入操作示例
    cout << "请输入需要插入的元素的位序i和值e：";
    cin >> i >> e;
    if (ListInsert_Sq(L, i, e)) {
        cout << "元素成功插入！" << endl;
    } else {
        cout << "插入失败！" << endl;
    }
    PrintList(L);
    
    // 删除操作示例
    cout << "请输入需要删除的元素的位序i：";
    cin >> i;
    if (ListDelete_Sq(L, i, e)) {
        cout << "元素成功删除，删除的元素值为：" << e << endl;
    } else {
        cout << "删除失败！" << endl;
    }
    PrintList(L);
    
    // 清空操作示例
    if (ClearList_Sq(L)) {
        cout << "顺序表已清空！" << endl;
    }
    PrintList(L);
    
    // 销毁顺序表
    if (DestroyList_Sq(L)) {
        cout << "顺序表已销毁！" << endl;
    }
    
    return 0;
}
